package com.atguigu.gmall.item.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.feign.ProductFeignClient;
import com.atguigu.gmall.item.service.ItemService;
import com.atguigu.gmall.model.product.BaseCategoryView;
import com.atguigu.gmall.model.product.SkuImage;
import com.atguigu.gmall.model.product.SkuInfo;
import com.atguigu.gmall.model.product.SpuSaleAttr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadPoolExecutor;

/***
 * 商品详情页面service层实现类
 */
@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private ProductFeignClient productFeignClient;
    @Autowired
    private ThreadPoolExecutor threadPoolExecutor;

    /**
     * 根据skuId查询商品详情信息
     *
     * @param skuId
     * @return
     */
    @Override
    public Map<String, Object> getSkuInfoDetailBySkyId(Long skuId) {
        //1 声明一个map，存放商品详情页面所需要的数据
//        Map<String, Object> map = new HashMap<>(); //线程不安全
        ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

        //使用异步编排
        //2 查询到skuInfo数据
        CompletableFuture<SkuInfo> future = CompletableFuture.supplyAsync(() -> {
            SkuInfo skuInfo = productFeignClient.getSkuInfoBySkuId(skuId);
            map.put("skuInfo",skuInfo);//将数据放入map中
            return skuInfo;
        },threadPoolExecutor);

        //3 根据category3_id查询一、二、三级分类的集合
        CompletableFuture<Void> future1 = future.thenAcceptAsync(skuInfo -> {
            if (skuInfo == null || skuInfo.getId() == null) {
                return;
            }
            BaseCategoryView baseCategoryView = productFeignClient.listCategoryByCategory3Id(skuInfo.getCategory3Id());
            map.put("baseCategoryView",baseCategoryView);//将数据放入map中
        },threadPoolExecutor);

        //4 根据sku_id查询sku图片集合
        CompletableFuture<Void> future2 = future.thenAcceptAsync(skuInfo -> {
            if (skuInfo == null || skuInfo.getId() == null) {
                return;
            }
            List<SkuImage> skuImageList = productFeignClient.listSkuImageBySkuId(skuId);
            map.put("skuImageList",skuImageList);//将数据放入map中
        },threadPoolExecutor);

        //5 单独查询价格
        CompletableFuture<Void> future3 = future.thenAcceptAsync(skuInfo -> {
            if (skuInfo == null || skuInfo.getId() == null) {
                return;
            }
            BigDecimal price = productFeignClient.getSkuInfoPriceBySkuId(skuId);
            map.put("price",price);//将数据放入map中
        },threadPoolExecutor);

        //6 查询销售属性数据，销售属性值数
        CompletableFuture<Void> future4 = future.thenAcceptAsync(skuInfo -> {
            if (skuInfo == null || skuInfo.getId() == null) {
                return;
            }
            List<SpuSaleAttr> spuSaleAttrList =
                    productFeignClient.listSpuSaleAttrBySpuIDAndSkuId(skuInfo.getSpuId(), skuId);
            map.put("spuSaleAttrList",spuSaleAttrList);//将数据放入map中
        },threadPoolExecutor);

        //7 查询每个sku对应的销售属性值，封装为一个map
        CompletableFuture<Void> future5 = future.thenAcceptAsync(skuInfo -> {
            if (skuInfo == null || skuInfo.getId() == null) {
                return;
            }
            Map skuIdValueIdsMap =
                    productFeignClient.listSkuSaleAttrValueBySpuId(skuInfo.getSpuId());
            map.put("skuIdValueIdsMap", JSONObject.toJSONString(skuIdValueIdsMap));//将数据放入map中
        },threadPoolExecutor);

        //8 步骤都执行成功返回结果
        CompletableFuture.allOf(future,future1,future2,future3,future4,future5).join();

//        //2 查询到skuInfo数据
//        SkuInfo skuInfo = productFeignClient.getSkuInfoBySkuId(skuId);
//        //2.1 判断商品是否为空
//        if(skuInfo == null || skuInfo.getId()== null){
//            return null;
//        }
//        map.put("skuInfo",skuInfo);//将数据放入map中
//
//        //3 根据category3_id查询一、二、三级分类的集合
//        BaseCategoryView baseCategoryView = productFeignClient.listCategoryByCategory3Id(skuInfo.getCategory3Id());
//        map.put("baseCategoryView",baseCategoryView);//将数据放入map中
//
//        //4 根据sku_id查询sku图片集合
//        List<SkuImage> skuImageList = productFeignClient.listSkuImageBySkuId(skuId);
//        map.put("skuImageList",skuImageList);//将数据放入map中
//
//        //5 单独查询价格
//        BigDecimal price = productFeignClient.getSkuInfoPriceBySkuId(skuId);
//        map.put("price",price);//将数据放入map中
//
//        //6 查询销售属性数据，销售属性值数
//        List<SpuSaleAttr> spuSaleAttrList = productFeignClient.listSpuSaleAttrBySpuIDAndSkuId(skuInfo.getSpuId(), skuId);
//        map.put("spuSaleAttrList",spuSaleAttrList);//将数据放入map中
//
//        //7 查询每个sku对应的销售属性值，封装为一个map
//        Map skuIdValueIdsMap = productFeignClient.listSkuSaleAttrValueBySpuId(skuInfo.getSpuId());
//        //map类型最好进行json串转换,方便前端进行处理
//        map.put("skuIdValueIdsMap", JSONObject.toJSONString(skuIdValueIdsMap));//将数据放入map中

        //8 返回结果
        return map;
    }
}
